/*****************************************
**  Nom : CARRUELLE						**
**	Nom du fichier : ChainArr			**
**	Description : Gestion du chainage	**
**	arriere								**
**										**
**	Date:09/08/2014					    **
**  Statut:Release						**
*****************************************/

/*****************************************
**  Zone de declaration des includes    **
*****************************************/
 
 #include "struct.h"

/*************************************************
**  Zone de déclaration des Fonctions PUBLIC    **
*************************************************/

/*************************************************************************
**  [Fonction ChainArr_VerifBut]                      					**
**  Moteur principal du chainage arriere						        **
**																		**
**	Entrees : Char* Tableau contenant le BUT                            **
**			: ST_RES* Tete de la chaine de resultats					**
**			: ST_FAITS* Tete de la chaine de faits						**
**																		**
**	Sorties : int														**
**				0 Le But n'est pas demontre                             **
**				1 Le But est valide                                 	**
**				-2 Erreur de chaine										**
**************************************************************************/
int ChainArr_VerifBut (char* But,ST_RES* res_tete,ST_FAITS* fait_tete)
{
	int result = 0;//Resultat de la recherche
	ST_RES *R=NULL;
	ST_COND *Hypothese=NULL;
	int Continue;
	
	if(strlen(But)==0)
		if(ChainArr_RecupBut (But,res_tete)<0)
			return -2;									//Recupere la but a chercher

	if(res_tete==NULL || fait_tete == NULL)				//si liste vide Erreur	
		return -2;
		
	if(!ChainArr_VerifFait (But,fait_tete))				//Verifie si le But courant est compris dans les fait
	{
		R = res_tete;
		while(R!=NULL && result == 0)					//Boucle tant que Regle != de null et result FAUX
		{			
			if(strcmp(But,R->res) !=  0)
			{
				;
			}
				
			else
			{
				Hypothese = R->TeteListCond;
				Continue = TRUE;
				while(Hypothese != NULL && Continue)
				{	
					Continue = ChainArr_VerifBut (Hypothese->cond,res_tete,fait_tete);
					Hypothese = Hypothese->suiv;
				}
				result = Continue;
				if(result == 1)
				{
					CreerListeCh_Creer_MaillonFaits(fait_tete, But);
				}
			}
			R=R->suiv;
		}
	}
	else
	{
		result = TRUE;
	}
		return result;								
}

/*************************************************
**  Zone de déclaration des Fonctions PRIVE     **
*************************************************/

/*************************************************************************
**  [Fonction ChainArr_RecupBut]                     					**
**  Récupere le but a demontrer depuis l'interface utilisateur          **
**																		**
**	Entrees : Char* Tableau contenant le BUT                            **
**			: ST_RES* Tete de la chaine de resultats					**
**																		**
**	Sorties : int														**
**				0 But correctement recupere                             **
**				-1 Erreur de memoire                                    **
**************************************************************************/
int ChainArr_RecupBut (char* But,ST_RES* res_tete)
{
	if(res_tete==NULL)//si liste vide Erreur	
		return -2;
			
	memset(But,0,MAXSIZE*sizeof(char));
	printf("Veuillez entrer votre recherche : ");
	scanf("%s",But);
	getchar();
	return 0;
}


/*************************************************************************
**  [ChainArr_VerifFait]    		                  					**
**  Verifie si le Bur est dans les faits						        **
**																		**
**	Entrees : Char* Tableau contenant le BUT                            **
**			: ST_FAITS* Tete de la chaine de faits						**
**																		**
**	Sorties : int														**
**				0 Le But est un fait		                            **
**				1 Le But n'est pas un fait                            	**
**				-2 Erreur de chaine										**
**************************************************************************/
int ChainArr_VerifFait (char* But,ST_FAITS* fait_tete)
{
	int result = 0;//Resultat de la recherche
	ST_FAITS *F=NULL;
	
	if(fait_tete==NULL)//si liste vide Erreur	
		return -2;

	F = fait_tete;
	while(F!=NULL && result == 0)
		{
			if(strcmp(F->fait,But) != 0)
			{
				result = 0;
			}
			
			else
			{
				result = 1;
			}
			F=F->suiv;
		}
	return result;
}
/*************************************************************************
**  [ChainArr_Simulation]    		                  					**
**  Simule un chainage arrière									        **
**																		**
**	Entrees : ST_RES* Tete_Res                                          **
**			: ST_FAITS* Tete de la chaine de faits						**
**																		**
**	Sorties : int														**
**				0 Le But est un fait		                            **
**				1 Le But n'est pas un fait                            	**
**				-2 Erreur de chaine										**
**************************************************************************/

int ChainArr_Simulation()
{
	 FILE* fp=NULL;
	 char But[MAXSIZE];
	 ST_RES* Tete_Res = NULL;
	 ST_FAITS* Tete_Faits = NULL;
	 
	 fp = CreerListeCh_OuvrirFic("regle_simulation","r");
 	 if(fp!=NULL && Tete_Res == NULL )
	 {
	 	CreerListeCh_LireBases('R', fp, &Tete_Faits, &Tete_Res);
	 	CreerListeCh_FermerFichier(fp);
	 }
				 
	 fp=CreerListeCh_OuvrirFic("fait_simulation","r");
	 if(fp!=NULL && Tete_Faits == NULL)
	 {
	 	CreerListeCh_LireBases('F', fp, &Tete_Faits, &Tete_Res);
	 	CreerListeCh_FermerFichier(fp);
	 }
	
	CreerListeCh_AfficherListe('R', Tete_Res, Tete_Faits);
	CreerListeCh_AfficherListe('F', Tete_Res, Tete_Faits);
	
	ChainArr_RecupBut (But,Tete_Res);

	if(ChainArr_VerifBut (But,Tete_Res, Tete_Faits) == 1)
		printf("Le but : <%s> est demontre\n",But);
	else
		printf("Le but : <%s> n'est pas demontre\n\n\n",But);
		
	sleep(1);
	
	CreerListeCh_AfficherListe('R', Tete_Res, Tete_Faits);
	CreerListeCh_AfficherListe('F', Tete_Res, Tete_Faits);
	
	printf("Appuyer sur entrer pour continuer");
	gets(But);
	
	CreerListeCh_FreeListe('R', &Tete_Res, &Tete_Faits);
	CreerListeCh_FreeListe('F', &Tete_Res, &Tete_Faits);

	return 0;		
}
